/**
 * 1获取用户的收货地址
 *    1.绑定点击事件
 *    2.调用小程序内置 api 获取用户的收货地址
 *        1.获取用户对小程序所授予获取地址的权限状态(scope)
 *        2.假设用户点击确定授权 scope为true(authSetting.scope.address)
 *            可以获取地址
 *        3.假设用户点击取消按钮 scope为false
 *            引导用户自己打开授权设置页面
 *        4.假设用户从来没有调用过收货地址api scope 为undifined
 *            可以获取地址
 *        5.把获取到的地址存储到本地中
 * 2页面加载完毕
 *     1.获取本地存储的地址数据
 *     2.设置给data 中的变量
 * 3获取缓存中的购物车数组(填充到data)
 * 4全选的实现
 *    1在onShow 获取缓存中的购物车数组
 *    2根据购物车中的数据进行计算 所有商品都被选中 全选就被选中
 * 5总价格和总数量
 *    1都需要商品被选中才计算
 *    2获取购物车数组并遍历
 *    3判断商品是否被选中
 *    4总价格 += 商品单价 * 商品的数量
 *    5总数量 += 商品的数量
 *    6把计算后的价格和数量赋值回data
 * 6商品的选中功能
 *    1绑定change事件
 *    2获取到被修改的商品对象
 *    3改变商品对象的选中状态
 *    4重新填充回data和缓存
 *    5重新计算全选,总价格,总数量
 * 7全选和反选功能
 *    1给全选的复选框绑定change事件
 *    2获取中的data的allChecked
 *    3allChecked直接取反
 *    4遍历购物车数组 让里面商品的选中状态 跟随 allChecked的改变而改变
 *    5把购物车数组 和 allChecked 重新设置到data中,把购物车重新设置到缓存中
 * 8商品数量的编辑功能
 *    1 + 和 - 绑定同一个点击事件(用自定义属性区分)
 *    2 传递被点击的商品id
 *    3 获取data中的购物车数组 来获取需要被修改的商品对象
 *    4 当购物车数量 = 1时 同时 用户点击"-"
 *        1弹窗提示用户是否删除 (wx.showModal)
 *        2是就删除 否则什么都不做 
 *    5 直接修改商品对象的数量属性 num
 *    6 重新设置回 data 和 缓存中(this.setCart) 
 * 9点击结算
 *    1判断有没有收货地址信息
 *    2判断用户有没有选购提示
 *    3都有的话,跳转到支付页面
 */

 import {showModal,showToast} from "../../utils/asyncWx.js"

Page({

  /**
   * 页面的初始数据
   */
  data: {
      address:{},
      cart:[],
      allChecked:false,
      totalPrice:0,
      totalNum:0
  },
  //点击收货地址
 handleChooseAddress(){
    //1获取权限状态
    wx.getSetting({
      success: result1=>{
        console.log(result1);
       const  scopeAddress  = result1.authSetting["scope.address"]; 
       //2判断 权限状态
    if(scopeAddress===false){
      //打开授权设置页面
      wx.openSetting({
        success:result2=>{
        }
      })
    }
      //调用获取收货地址的api
       wx.chooseAddress({
         success:address=>{
          address.all = address.provinceName+address.cityName+address.countyName+address.detailInfo
           //存入到缓存中
           wx.setStorageSync("address",address)
         }
       })
      }
    })
    
   
    
  },
  //商品的选中
  handleItemChange(e){
    //1获取被修改的商品id
    const goods_id = e.currentTarget.dataset.id
    //2获取购物车数组
    let {cart} = this.data
    //3找到被修改的商品对象
    let index = cart.findIndex(v=>v.goods_id===goods_id)
    //4选中状态取反
    cart[index].checked = !cart[index].checked
    //重新设置cart数据
    this.setCart(cart)
    
  },
  //设置购物车状态 重新计算底部工具栏的数据(总价格,总数量,全选)
  setCart(cart){
    //重新计算总价格,总数量,全选
    let totalPrice = 0
    let totalNum = 0
    let allChecked = true
      cart.forEach(v=>{
        if(v.checked){
          totalPrice += v.goods_price * v.num
          totalNum += v.num
        }else{
          allChecked = false
        }
      })
      //判断是否为空
      allChecked = cart.length!=0?allChecked:false
      //设置回data和缓存中
    this.setData({
      cart,
      totalPrice,
      totalNum,
      allChecked
    })
      //存到缓存
      wx.setStorageSync("cart",cart)
  },
  //商品的全选功能
  hadleItemAllChecked(){
    //1获取data中的数据
    let {cart,allChecked} = this.data
    //2修改值
    allChecked =!allChecked
    //3虚幻修改cart数组的商品选中状态
    cart.forEach(v=>v.checked=allChecked)
    //4把修改中的值 填充会data 和 缓存中
    this.setCart(cart)
  },
  //商品编辑的功能
async  handleItemNumEdit(e){
    //1获取事件传递的参数 (id,操作符)
    const {id,operation} = e.currentTarget.dataset
    //2获取购物车数组
    let {cart} = this.data
    //3找到需要修改的商品的索引
    const index = cart.findIndex(v=>v.goods_id===id)
    //4判断是否要执行删除
    if(cart[index].num===1 && operation===-1){
      //4.1弹窗提示
      const res = await showModal({content:"您是否要删除?"})
      if(res.confirm){
        cart.splice(index,1)
        this.setCart(cart)
        }
    }else{
      //5修改数量
      cart[index].num +=operation
      //6设置回data和缓存中
      this.setCart(cart)
    }
    
  },
  //结算功能
 async handlePay(){
    //1判断收货地址
    const {address,totalNum} = this.data
    if(!address.userName){
       await showToast({title:"您还没有选择收货地址"})
       return;
    }
    //2判断有没有选购商品
    if(totalNum===0){
      await showToast({title:"您还没有选购商品"})
      return;
    }
    //3跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
      //1获取缓存的地址信息
      const address = wx.getStorageSync('address')
      //2获取缓存中的购物车数据
      const cart = wx.getStorageSync('cart') || []
      //3计算全选
       //every 数组方法,会遍历每一个回调函数,回调都返回true,方法就返回true,否则返回false
       //空数组调用every 也会返回true
      // const allChecked = cart.length>0?cart.every(v=>v.checked):0
      this.setData({address})
      this.setCart(cart)

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})